#ifndef DRAW_H
#define DRAW_H

#include "bmp.h"
#include "chessDef.h"
#include "board.h"
#include "lcd.h"
#include <iostream>
#include <cstring>

// 功能按钮坐标定义
#define BTN_REDO_X 40         // 红方悔棋按钮X坐标
#define BTN_REDO_Y 77         // 红方悔棋按钮Y坐标
#define BTN_REDO2_X 700       // 黑方悔棋按钮X坐标
#define BTN_REDO2_Y 77        // 黑方悔棋按钮Y坐标
#define BTN_RESTART_X 680     // 重新开局按钮X坐标
#define BTN_RESTART_Y 5       // 重新开局按钮Y坐标
#define BTN_SAVE_X 20         // 存档按钮X坐标
#define BTN_SAVE_Y 415        // 存档按钮Y坐标
#define BTN_DRAW_X 40         // 红方求和按钮X坐标
#define BTN_DRAW_Y 190        // 红方求和按钮Y坐标
#define BTN_DRAW2_X 700       // 黑方求和按钮X坐标
#define BTN_DRAW2_Y 190       // 黑方求和按钮Y坐标
#define BTN_GIVEUP_X 40       // 红方认输按钮X坐标
#define BTN_GIVEUP_Y 302      // 红方认输按钮Y坐标
#define BTN_GIVEUP2_X 700     // 黑方认输按钮X坐标
#define BTN_GIVEUP2_Y 302     // 黑方认输按钮Y坐标
#define BTN_MENU_X 20         // 返回菜单按钮X坐标
#define BTN_MENU_Y 5          // 返回菜单按钮Y坐标
#define BTN_EXIT_X 680        // 退出游戏按钮X坐标
#define BTN_EXIT_Y 415        // 退出游戏按钮Y坐标
#define BTN_WIDTH 100         // 按钮宽度
#define BTN_HEIGHT 60         // 按钮高度

// 棋盘绘制类
class drawBoard 
{
private:  // 显式声明私有成员
    // 棋盘初始坐标与尺寸
    const int boardX = 150;     // 棋盘左上角X坐标
    const int boardY = 15;      // 棋盘左上角Y坐标
    const int cellSize = 50;    // 单元格大小（像素）

    // 双缓冲核心参数（800x480分辨率）
    int* buffer;                // 内存缓冲区（与LCD显存格式一致：int*，4字节/像素）
    const int screenWidth = 800;  // 屏幕宽度
    const int screenHeight = 480; // 屏幕高度
    const int bufferSize = 800 * 480 * 4;  // 缓冲区总大小（字节）

    bool isDualMode; // 双机模式标记（控制按钮绘制）
    bool isAIMode;   // 人机模式标记

    // 私有辅助函数
    void drawOnePiece(ChessDef::pieceID pieceId, int row, int col, int *buf);  // 绘制单个棋子
    void drawBoardBackground(int *buf);  // 绘制棋盘背景
    void drawButton(const std::string& bmpPath, int x, int y, int* buf);  // 绘制按钮

public:  
    // 构造函数：初始化双缓冲区
    drawBoard();
    // 析构函数：释放缓冲区
    ~drawBoard();

    // 公有绘制方法
    void draw(const Board &board, Pos selectedPos);  // 绘制整个棋盘（含选中状态）
    void drawSelected(Pos pos, int* buf);  // 绘制选中状态标记
    void drawBmp(const std::string& imgPath, int x, int y);  // 绘制BMP图片
    void drawFunctionButtons(int* buf);  // 绘制对局中所有功能按钮
    //设置双机模式画功能图标
    void setDualMode(bool mode);
    //设置人机模式画功能图标 
    void setAIMode(bool mode);
};

// 全局绘图工具实例（用于调用bmp画图工具）
static drawBoard g_draw;

#endif // DRAW_H